<?php



class FileSystem {
	

	public static function directoryExists($directory){
		return file_exists($directory);
	}
	

	public static function createDirectory($directory,$doLog=true){
		if(!self::directoryExists($directory)){
			if(!mkdir($directory, 0755, true)){
				if($doLog) Message::crash("Le répertoire ($directory) n'a pas pu être créé");
				return false;
			}
			if($doLog) Message::debug("Création du dossier ($directory)");
		}
		return true;
	}


	public static function fileExists($file){
		return file_exists($file);
	}
	

	public static function createFile($file,$doLog=true){
		if(!self::fileExists($file)){
			$path_parts=pathinfo($file);
			if(!self::createDirectory($path_parts['dirname'],$doLog)){
				return false;
			}
			$fp = fopen($file,'wb');
			if($fp == false){
				if($doLog) Message::crash("Le fichier ($file) n'a pas pu être créé");
				return false;
			}
			if($doLog) Message::debug("Création du fichier ($file)");
			fclose($fp);
		}
		return $file;
	}
	
	
	public static function moveFile($from, $to){
		Message::debug("Déplacement du fichier ($from) vers ($to)");
		if(rename($from, $to)){
			return true;
		}
		else{
			// Sinon on affiche une erreur systeme
			Message::crash("Le fichier ($from) n'a pas pu être déplacé vers ($to)");
		}
		return false;
	}
	
	
	public static function listFiles($directory){
		Message::debug("Liste des fichiers du répertoire ($directory)");
		$liste=array();
		if ($handle = opendir($directory)) {
			while (false !== ($entry = readdir($handle))) {
				if ($entry != '.' && $entry != '..' && !is_dir($entry)) {
					$liste[]=$entry;
				}
			}
			closedir($handle);
		}
		return $liste;
	}
	
	
	public static function readFile($file){
		Message::debug("Lecture du fichier ($file)");
		$lignes=array();
		if($data = file_get_contents($file)){
			$lignes = explode("\n", $data);
		}
		else{
			Message::warn("Le fichier ($file) est vide ou n'existe pas");
		}
		return $lignes;
	}
	
	
	public static function deleteFile($file){
		Message::debug("Suppression du fichier ($file)");
		if(!unlink($file)){
			Message::warn("Le fichier ($file) n'a pas été supprimé");
		}
	}
	
	
	public static function removeDirectory($dir){
		if(self::directoryExists($dir)){
			Message::debug("Suppression du répertoire ($dir)");
			$files = array_diff(scandir($dir), array('.','..')); 
			foreach ($files as $file) { 
				(is_dir("$dir/$file")) ?
					self::removeDirectory("$dir/$file") :
					unlink("$dir/$file"); 
			} 
			return rmdir($dir); 
		}
		return true;
	}
	
	
	public static function clearDirectory($dir){
		Message::debug("Suppression du contenu du répertoire ($dir)");
		array_map('unlink', glob($dir.'*'));
	}
	
	
	public static function write($file,$content){
		Message::debug("Ecriture dans le fichier ($file) ".strlen($content).' caractères');
		$fp = fopen($file, 'w');
		//$content=iconv('UTF-8', 'Windows-1252', $content);
		//$content=mb_convert_encoding($content, 'Windows-1252');
		fwrite($fp, $content);
		fclose($fp);
		Message::debug('Ecriture ok ('.count(self::readFile($file)).' lignes)');
		return true;
	}
	
	
	public static function copyDir($from,$to){
		Message::debug("Copie du répertoire ($from) vers ($to)");
		foreach(self::listFiles($from) as $file){
			self::copyFile($from.$file, $to.$file);
		}
		return true;
	}
	
	
	public static function copyFile($from,$to){
		Message::debug("Copie du fichier ($from) vers ($to)");
		if (!copy($from, $to)) {
			Message::log('La copie du fichier a échoué');
			return false;
		}
		return true;
	}
	
	
	public static function makeTree($tree,$from='./'){
		foreach($tree as $nomDir => $branche){
			self::createDirectory($from.$nomDir);
			if(is_array($branche)){
				self::makeTree($branche, $from.$nomDir.'/');
			}
		}
		return true;
	}

	

}



 
?>